OpenMP(使用C++多线程并行计算优化你的程序)入门篇 您所在的位置:网站首页 c++ for each循环 OpenMP(使用C++多线程并行计算优化你的程序)入门篇

OpenMP(使用C++多线程并行计算优化你的程序)入门篇

#OpenMP(使用C++多线程并行计算优化你的程序)入门篇| 来源: 网络整理| 查看: 265

前言

OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。

OpenMP采用可移植的、可扩展的模型,为程序员提供了一个简单而灵活的开发平台,从标准桌面电脑到超级计算机的并行应用程序接口。

混合并行编程模型构建的应用程序可以同时使用OpenMP和MPI,或更透明地通过使用OpenMP扩展的非共享内存系统上运行的计算机集群。——WIKI

openmp官方文档:

安装

无需安装,GCC自带,在编译时加入-fopenmp参数即可。本文使用g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

语法及选项(来自wiki)#pragma omp [clause[[,] clause] ...]directiveatomic 内存位置将会原子更新(Specifies that a memory location that will be updated atomically.)barrier 线程在此等待,直到所有的线程都执行到此barrier。用来同步所有线程。critical 其后的代码块为临界区,任意时刻只能被一个线程执行。flush 所有线程对所有共享对象具有相同的内存视图(view of memory)for 用在for循环之前,把for循环并行化由多个线程执行。循环变量只能是整型master 指定由主线程来执行接下来的程式。ordered 指定在接下来的代码块中,被并行化的 for循环将依序执行(sequential loop)parallel 代表接下来的代码块将被多个线程并行各执行一遍。sections 将接下来的代码块包含将被并行执行的section块。single 之后的程式将只会在一个线程(未必是主线程)中被执行,不会被并行执行。threadprivate 指定一个变量是线程局部存储(thread local storage)

clause

copyin 让threadprivate的变量的值和主线程的值相同。copyprivate 不同线程中的变量在所有线程中共享。default Specifies the behavior of unscoped variables in a parallel region.firstprivate 对于线程局部存储的变量,其初值是进入并行区之前的值。if 判断条件,可用来决定是否要并行化。lastprivate 在一个循环并行执行结束后,指定变量的值为循环体在顺序最后一次执行时取得的值,或者#pragma sections在中,按文本顺序最后一个section中执行取得的值。nowait 忽略barrier的同步等待。num_threads 设定线程数量的数量。默认值为当前计算机硬件支持的最大并发数。一般就是CPU的内核数目。超线程被操作系统视为独立的CPU内核。ordered 使用于 for,可以在将循环并行化的时候,将程式中有标记 directive ordered 的部份依序执行。private 指定变量为线程局部存储。reduction Specifies that one or more variables that are private to each thread are the subject of a reduction operation at the end of the parallel region.schedule 设定for循环的并行化方法;有 dynamic、guided、runtime、static 四种方法。schedule(static, chunk_size) 把chunk_size数目的循环体的执行,静态依序指定给各线程。schedule(dynamic, chunk_size) 把循环体的执行按照chunk_size(缺省值为1)分为若干组(即chunk),每个等待的线程获得当前一组去执行,执行完后重新等待分配新的组。schedule(guided, chunk_size) 把循环体的执行分组,分配给等待执行的线程。最初的组中的循环体执行数目较大,然后逐渐按指数方式下降到chunk_size。schedule(runtime) 循环的并行化方式不在编译时静态确定,而是推迟到程序执行时动态地根据环境变量OMP_SCHEDULE 来决定要使用的方法。shared 指定变量为所有线程共享。例程Hello,openmp!#include #include "omp.h" using std::cout; using std::endl; int main() { #pragma omp parallel cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有